/*******************************************************
 * 文件名称:  com.minis.beans.SimpleBeanFactory
 *
 * 系统名称:
 *
 * 模块名称:
 *
 * 软件版权: 小刘开发
 *
 * 功能说明:
 *
 * 开发人员: rui.liu
 *
 * 开发时间: 2024/8/12 10:02
 *
 * 修改记录:
 *
 *
 *
 * 程序版本     修改日期   修改人员   修改单号
 *
 *******************/
package com.minis.beans;

import com.minis.exception.BeansException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>Title: SimpleBeanFactory</p>
 * <p>Description: </p>
 *
 * @Author rui.liu
 * @Date 2024/8/12 10:02
 * @Version
 */
public class SimpleBeanFactory implements BeanFactory{
    private List<BeanDefinition> beanDefinitions = new ArrayList<>();

    private List<String> beanNames = new ArrayList<>();

    public SimpleBeanFactory() {
    }

    private Map<String,Object> singletons  = new HashMap<>();

    //getBean，容器的核心方法
    @Override
    public Object getBean(String beanName) throws BeansException {
        // 懒汉单例模式
        // 先尝试直接拿bean实例对象
        Object singleton = singletons.get(beanName);

        // 如果没有则创建一个
        if (singleton == null ) {
            int i = beanNames.indexOf(beanName);
            if (i == -1) {
                throw new BeansException("配置文件中没有发现" + beanName);
            } else {
                BeanDefinition beanDefinition = beanDefinitions.get(i);
                // 通过反射机制拿到对应的实例化对象
                try {
                   singleton = Class.forName(beanDefinition.getClassName()).newInstance();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                // 注册Bean实例化对象
                singletons.put(beanDefinition.getId(),singleton);
            }
        }
        return singleton;
    }

    @Override
    public void registerBeanDefinition(BeanDefinition beanDefinition) {
            this.beanDefinitions.add(beanDefinition);
            this.beanNames.add(beanDefinition.getId());
    }
}
